"""
在开发过程中，需要修改数据库模型，而且还要在修改之后更新数据库。最直接的方式就是删除旧表，但这样会丢失数据。

更好的解决办法是使用数据库迁移框架，它可以追踪数据库模式的变化，然后把变动应用到数据库中。
在Flask中可以使用Flask-Migrate扩展，来实现数据迁移。并且集成到Flask-Script中，所有操作通过命令就能完成。

为了导出数据库迁移命令，Flask-Migrate提供了一个MigrateCommand类，可以附加到flask-script的manager对象上。
"""

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate,MigrateCommand
from flask_script import Manager

class Config(object):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = "mysql://root:mysql@127.0.0.1:3306/migrate_01"
    SQLALCHEMY_TRACK_MODIFICATIONS = True
    SECRET_KEY = "djsodigjspodjgcsnpsjgdpos"

app = Flask(__name__)
app.config.from_object(Config)
# 创建数据库对象
db = SQLAlchemy(app)
# 创建迁移对象
migrate = Migrate(app,db)
# 创建管理类对象
manager = Manager(app)
# 通过管理类添加数据库迁移指令
manager.add_command('db',MigrateCommand)

"""
(必须掌握)   第一次执行相当于：db.create_all()
# 第一次数据库迁移初始化操作 产生一个migrations文件夹 （只需执行一次）
python3 demo2_migrate.py db init

# 执行数据库迁移 生成一个对应版本  -m：注释   (只要模型类的结构发生改变每次都需要执行)
python3 demo2_migrate.py db migate -m "messge"

# 执行数据库版本的升级 才会真正在数据库创建表  (只要模型类的结构发生改变每次都需要执行)
python3 demo2_migrate.py db upgrade


（会copy）
# 查看历史版本
python3 demo2_migrate.py db history

# 回到低版本
python3 demo2_migrate.py db downgrade 版本号

# 回到高版本
python3 demo2_migrate.py db upgrade 版本号


"""



#3.创建模型类 默认是类名的小写作为表的名称：author
class Author(db.Model):
    """作者类  一的一方"""
    # id字段
    id = db.Column(db.Integer, primary_key=True)
    # name字段
    name = db.Column(db.String(64), unique=True)
    # 添加邮箱字段
    email = db.Column(db.String(64), unique=True)
    # # 添加密码字段
    password = db.Column(db.String(64), unique=True)
    # 定义关系字段方便查询
    # author.books 该作者编写了那些书籍
    # book.author  该书籍属于哪个作者
    books = db.relationship("Book", backref='author')

    def __repr__(self):
        return "Author: %s  %s " % (self.id, self.name)


class Book(db.Model):
    """书籍类 多的一方"""
    # id字段
    id = db.Column(db.Integer, primary_key=True)
    # name字段
    name = db.Column(db.String(64), unique=True)
    # 定义外键
    author_id = db.Column(db.Integer, db.ForeignKey(Author.id))

    def __repr__(self):
        return "Book: %s  %s " % (self.id, self.name)


@app.route('/')
def hello():
    return "hello world"

if __name__ == "__main__":
    manager.run()